/**
 * Esta clase representa los test de estados de envios.
 */
package estadosDelEnvio;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

import org.junit.Before;
import org.junit.Test;

import envios.EnvioAPagar;
import envios.EnvioPagado;
import estadosDelEnvio.Cancelado;
import estadosDelEnvio.EstadoDeEnvio;
import exceptions.StatesException;

/**
 * @author Lucas Alan Silvestri.
 *
 */
public abstract class EstadoDeEnviosTest {

	private EstadoDeEnvio sut;
	private EnvioAPagar envioAPagar;
	private EnvioPagado envioPagado;
	
	/**
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception {
		this.setEnvioAPagar(mock(EnvioAPagar.class));
		this.setEnvioPagado(mock(EnvioPagado.class));
		
	}
	
	/**
	 * este test demuestra que el estado
	 * no esta cancelado.
	 */
	@Test
	public void estoyCanceladoTest(){
		assertEquals(false,this.getSut().estoyCancelado());
	}
	
	/**
	 * este test demuestra que el estado
	 * no esta entregado.
	 */
	@Test
	public void estoyEntregadoTest(){
		assertEquals(false,this.getSut().estoyEntregado());
	}
	
	/**
	 * este test demuestra que el estado
	 * no esta pendiente de envio.
	 */
	@Test
	public void estoyPendienteDeEnvioTest(){
		assertEquals(false,this.getSut().estoyPendienteDeEnvio());
	}
	
	/**
	 * este test demuestra que el estado
	 * no esta en proceso de envio.
	 */
	@Test
	public void estoyEnProcesoDeEnvioTest(){
		assertEquals(false,this.getSut().estoyEnProcesoDeEnvio());
	}
	
	/**
	 * Este test demuestra que en esta etapa
	 * no se puede enviar un envio pagado.
	 * @throws StatesException
	 */
	@Test(expected = StatesException.class)
	public void enviarEnvioPagadoTest() throws StatesException{
		this.getSut().enviarEnvio(this.getEnvioPagado());
	}
	
	/**
	 * Este test demuestra que en esta etapa
	 * no se puede enviar un envio a pagar.
	 * @throws StatesException
	 */
	@Test(expected = StatesException.class)
	public void enviarEnvioAPagarTest() throws StatesException{
		this.getSut().enviarEnvio(this.getEnvioAPagar());
	}
	
	/**
	 * Este test demuestra que en esta etapa
	 * no se puede entregar un envio pagado.
	 * @throws StatesException
	 */
	@Test(expected = StatesException.class)
	public void entregarEnvioPagadoTest() throws StatesException{
		this.getSut().entregarEnvio(this.getEnvioPagado());
	}
	
	/**
	 * Este test demuestra que en esta etapa
	 * no se puede entregar un envio a pagar.
	 * @throws StatesException
	 */
	@Test(expected = StatesException.class)
	public void entregarEnvioAPagarTest() throws StatesException{
		this.getSut().entregarEnvio(this.getEnvioAPagar());
	}

	/**
	 * Este test demuestra que en esta etapa
	 * se puede cancelar un envio a pagar.
	 * @throws StatesException
	 */
	@Test
	public void cancelarEnvioAPagarTest() throws StatesException{
		this.getSut().cancelarEnvio(this.getEnvioAPagar());
		verify(this.getEnvioAPagar()).cambiarEstado(any(Cancelado.class));
		verify(this.getEnvioAPagar()).devolverProductos();		
	}
	
	/**
	 * Este test demuestra que en esta etapa
	 * se puede cancelar un envio pagado.
	 * @throws StatesException
	 */
	@Test
	public void cancelarEnvioAPagadoTest() throws StatesException{
		this.getSut().cancelarEnvio(this.getEnvioPagado());
		verify(this.getEnvioPagado()).cambiarEstado(any(Cancelado.class));
		verify(this.getEnvioPagado()).devolverProductos();
	}
	
	/**
	 * @return the sut
	 */
	public EstadoDeEnvio getSut() {
		return sut;
	}

	/**
	 * @param sut the sut to set
	 */
	public void setSut(EstadoDeEnvio sut) {
		this.sut = sut;
	}
	
	/**
	 * @return the envioAPagar
	 */
	public EnvioAPagar getEnvioAPagar() {
		return envioAPagar;
	}

	/**
	 * @param envioAPagar the envioAPagar to set
	 */
	public void setEnvioAPagar(EnvioAPagar envioAPagar) {
		this.envioAPagar = envioAPagar;
	}

	/**
	 * @return the envioPagado
	 */
	public EnvioPagado getEnvioPagado() {
		return envioPagado;
	}

	/**
	 * @param envioPagado the envioPagado to set
	 */
	public void setEnvioPagado(EnvioPagado envioPagado) {
		this.envioPagado = envioPagado;
	}

}
